package hihocode;

import java.util.Arrays;
import java.util.Scanner;

public class MaxSet {

//	public static void main(String[] args) {
//		Scanner scanner = new Scanner(System.in);
//		int n;
//		int[] nums;
//		boolean[] flags;
//		int max = 0, cur = 0;
//		while(scanner.hasNext()){
//			n = scanner.nextInt();
//			nums = new int[n + 1];
//			flags = new boolean[n + 1];
//			for(int i = 1; i <= n; i++){
//				nums[i] = scanner.nextInt();
//			}
//			// O(n^2)，超时，通过60%
//			for(int i = 1; i <= n; i++){
//				if(!flags[nums[i]]){
//					flags[nums[i]] = true;
//					int j = nums[i];
//					cur++;
//					while(!flags[nums[j]]){
//						flags[nums[j]] = true;
//						j = nums[j];
//						cur++;
//					}
//					if(cur == n){
//						max = n;
//						break;
//					}
//					max = Math.max(max, cur);
//				}
//				Arrays.fill(flags, false);
//				cur = 0;
//			}
//			System.out.println(max);
//		}
//		scanner.close();
//	}
	
	private static class UnionFind{
		int[] id;
		int[] count;
		public UnionFind(int n){
			id = new int[n + 1];
			//记录每个组的count
			count = new int[n + 1];
			for(int i = 1; i <= n; i++){
				id[i] = i;
				count[i] = 1;
			}
		}
		private int find(int p){
	        if (p == id[p]) return p;
	        return id[p] = find(id[p]);
	    }
		
		public void union(int i, int j) {
			//找到i，j所在集合的代表元素
			int rp = find(i);
	        int rq = find(j);
	        if (rp == rq) return;
	        
	        //count[rp]表示该元素代表集合的大小
	        id[rp] = rq;
	        count[rq] += count[rp];
	        count[rp] = count[rq];
		}
	
		public boolean isUnion(int i, int j){
			return find(i) == find(j);
		}
	}
	
	//试试并查集
	//AC
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int n;
		int[] nums;
		int max = 0;
		while(scanner.hasNext()){
			n = scanner.nextInt();
			UnionFind uf = new UnionFind(n);
			nums = new int[n + 1];
			
			for(int i = 1; i <= n; i++){
				nums[i] = scanner.nextInt();
			}
			for(int i = 1; i <= n; i++){
				if(uf.count[i] != 1){
					max = Math.max(max, uf.count[i]);
					continue;
				}
				int j = nums[i];
				while(j != i && !uf.isUnion(i, j)){
					uf.union(i, j);
					i = j;
					j = nums[i];
				}
				max = Math.max(max, uf.count[i]);
			}
			System.out.println(max);
		}
		scanner.close();
	}
}
